﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MapColoring.CSP
{
    /// <summary>
    /// Representa uma variável de um problema CSP
    /// </summary>
    public class VariavelCSP
    {
        #region Campos Privados

        private int idVariavel;
        private List<int> restricoes;
        private List<CSP.Cores> dominio;

        #endregion

        #region Propriedades

        /// <summary>
        /// Identficador da variável
        /// </summary>
        public int IdVariavel
        {
            get { return this.idVariavel; }
            set { this.idVariavel = value; }
        }

        /// <summary>
        /// Lista de restrições a essa variável. Contém uma lista de ids de 
        /// outras variáveis
        /// </summary>
        public List<int> Restricoes
        {
            get { return this.restricoes; }
            set { this.restricoes = value; }
        }

        /// <summary>
        /// Domínio de valores desta variável
        /// </summary>
        public List<CSP.Cores> Dominio
        {
            get { return this.dominio; }
            set { this.dominio = value; }
        }
        
        #endregion

        #region Construtores

        /// <summary>
        /// Representa uma variável de um problema CSP
        /// </summary>
        /// <param name="idVariavel">id da variável</param>
        /// <param name="restricoes">lista de restrições desta variável</param>
        /// <param name="dominio">domínio da variável</param>
        public VariavelCSP(int idVariavel, List<int> restricoes, List<CSP.Cores> dominio)
        {
            this.IdVariavel = idVariavel;
            this.Restricoes = restricoes;
            this.Dominio = dominio;
        }

        #endregion

        #region Métodos Públicos

        /// <summary>
        /// Remove cor do domínio da variável
        /// </summary>
        /// <param name="cor">cor a ser removida</param>
        public void RemovePossibilidade(CSP.Cores cor)
        {
            int index = -1;
            for (int i = 0; i < this.Dominio.Count; i++)
                if (this.Dominio[i] == cor)
                    index = i;

            if (index != -1)
                this.Dominio.RemoveAt(index);
        }

        #endregion
    }
}
